package com.Thread;

import java.io.*;

/**
 * @ClassName Demo2
 * @Description 编写一个Java程序，创建一个守护线程和一个用户线程，用户线程实现文件的拷贝，而守护线程实现打印输出拷贝进度（每隔500毫秒输出一下进度）
 * @Author Kx
 * @Date 2025/3/7 14:58
 * @Version 1.0
 */
public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        // 源文件路径和目标文件路径
        String sourceFile = "D:\\CyPro\\java学习资料\\尚硅谷Java入门教程，java电子书+Java面试真题（2023新版）\\01_课件与电子教材\\尚硅谷_第02章_变量与运算符\\【拓展】CodeCharts.pdf";
        String targetFile = "D:\\CyPro\\java学习资料\\尚硅谷Java入门教程，java电子书+Java面试真题（2023新版）\\01_课件与电子教材\\尚硅谷_第02章_变量与运算符\\CodeCharts.pdf";

        // 创建用户线程
        Thread copyThread = new Thread(new CopyFileThread(sourceFile, targetFile));
        copyThread.start(); // 开启线程
//        Thread.sleep(100);

        // 创建守护线程
        Thread progressThread = new Thread(new ProgressThread());
        // 设置成为守护线程
        progressThread.setDaemon(true);
        progressThread.start(); // 开启线程
    }
}

/**
 * @description: 用户线程
 * @author: Kx
 * @date: 2025/3/7 15:01
 * @param:
 * @return:
 **/
class CopyFileThread extends Thread {
    private String sourceFile; // 源文件路径
    private String targetFile; // 目标文件路径

    public CopyFileThread(String sourceFile, String targetFile) {
        this.sourceFile = sourceFile;
        this.targetFile = targetFile;
    }
    @Override
    public void run() {
        // 创建文件输入流和文件输出流
        try (FileInputStream in = new FileInputStream(sourceFile);
             FileOutputStream out = new FileOutputStream(targetFile)) {

            byte[] buffer = new byte[1024];  // 缓冲区
            // 读取文件内容并写入目标文件
            int bytesRead;
            long totalBytes = new File(sourceFile).length();  // 获取文件总大小
            ProgressThread.setTotalBytes(totalBytes);
            long copiedBytes = 0;

            // 循环拷贝文件
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
                copiedBytes += bytesRead;
                // 更新拷贝进度
                ProgressThread.setProgress(copiedBytes);

//                try {
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }
            System.out.println("文件拷贝完成！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * @description: 守护线程
 * @author: Kx
 * @date: 2025/3/7 15:18
 * @param:
 * @return:
 **/
class ProgressThread extends Thread {
    private static volatile long copiedBytes = 0; // 已拷贝的字节数
    private static volatile long totalBytes = 0; // 文件总大小
    @Override
    public void run() {
        while (true) {
//            System.out.println(copiedBytes);
//            System.out.println(totalBytes);
//            int progress = (int) ;  // 计算进度
            if (totalBytes == 0) {
                continue;
            }
            System.out.println("拷贝进度: " + ((copiedBytes * 100) / totalBytes) + "%");

            try {
                Thread.sleep(500);  // 每500毫秒打印一次
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    // 设置进度
    public static void setProgress (long copied) {
        copiedBytes = copied;
//        totalBytes = total;
    }
    public static void setTotalBytes(long total){
        totalBytes = total;
    }
}


